package com.android.support.lib.universal.rx;

import java.util.List;
import java.util.Map;

import okhttp3.RequestBody;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;
import retrofit2.RxJavaCallAdapterFactory;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Query;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * rx类库使用说明
 * 
 * @author 彭治铭
 *
 */
public class ApiClient {
	// 接口
	public interface IApiService {
		static final String BASE_URL = "http://www.cncnails.com/";// 基本URL域名

		// get请求，其url会自动接上BASE_URL
		@GET("mapi/goods/get_category_list")
		Observable<Modle<String>> getGoods(@Query("pagenum") int pageNo,
										   @Query("num") int pageSize);// @Query表示一般参数

		// 表示以表单形式提交
		@FormUrlEncoded
		// post请求
		@POST("mapi/shoppingcart/submit_order")
		Observable<Modle<Modle>> postGoods(@Field("phonenum") String phonenum);// @Field
																				// 表示表单字段

		@POST("mapi/shoppingcart/submit_order")
		// 注意，@Body不要添加@FormUrlEncoded，不然报错。
		Observable<Modle<String>> shoppingcartSubmitOrder(@Body List<Modle> body);// @Body提交实体类对象,一般在list集合里,也可以是一个单独的实体类
																					// (@Body
																					// Modle

		@FormUrlEncoded
		@POST("api/v1/user/address.shtml")
		Observable<Modle<String>> addAddress(
				@FieldMap Map<String, String> fieldMap);// @FieldMap
														// 将表单参数放入map集合

		// put請求，也post請求類似，常用作添加操作
		@PUT("api/v1/user/shoppingcart.shtml")
		Observable<Modle<String>> addShoppingChart(@Query("uid") String uid,
												   @Query("commodityNo") String commodityNo,
												   @Query("amount") int amount);

		// delete请求，常用作删除操作
		@DELETE("api/v1/user/shoppingcart.shtml")
		Observable<Modle<String>> deleteShoppingChart(@Query("uid") String uid,
													  @Query("commodityNo") String commodityNo);

		// 上传
		@Multipart
		@POST("mapi/member/upload")
		// 这种方法，图片名称(filename)可以灵活修改
		// Observable<Modle<String>> upload(@PartMap Map<String, RequestBody>
		// params);
		// filename(参数必不可少),这种方法文件名却只能是常量，固定死了，其中Filedata对应服务器上的文件参数，后面格式是规定。
		Observable<Modle<String>> upload(
				@Part("Filedata\"; filename=\"文件名.jpg") RequestBody req);

		//以下是上传，调用实例的参数
		// File file = new File(result);
		// RequestBody requestBody =
		// RequestBody.create(MediaType.parse("image/*"), file);
		// Map map=new HashMap();
		// map.put("Filedata\"; filename=\""+file.getName()+"",
		// requestBody);//Filedata是服务器参数名。后面格式是规定。

	}

	// 泛形实体类，其属性名与json数据字段名相对应
	class Modle<T> {
		String id;
		String name;
		List<T> list;
	}

	// 初始化
	static Retrofit sRetrofit = new Retrofit.Builder()
			.baseUrl(IApiService.BASE_URL)
			.addConverterFactory(GsonConverterFactory.create())
			.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

	public static IApiService sApiService = sRetrofit.create(IApiService.class);

	/**
	 * 在其他类中调用案例
	 */
	// ApiClient.sApiService.getGoods(1, 5).subscribeOn(Schedulers.io())
	// .observeOn(AndroidSchedulers.mainThread())
	// .subscribe(new Subscriber<Modle<String>>() {// 实现Subscriber的回调方法即可
	//
	// @Override
	// public void onCompleted() {
	// // 不一定会执行
	//
	// }
	//
	// @Override
	// public void onError(Throwable arg0) {
	// // 失败后回调
	//
	// }
	//
	// @Override
	// public void onNext(Modle<String> arg0) {
	// // 成功后回调,直接返回对应的实体类对象
	//
	// }
	// });

}
